package com.truedian.wg.components.organism.dialog

import com.cc.openeye.base.BasePager
import com.tencent.kuikly.core.base.ComposeAttr
import com.tencent.kuikly.core.base.ComposeEvent
import com.tencent.kuikly.core.base.ComposeView
import com.tencent.kuikly.core.base.ViewBuilder
import com.tencent.kuikly.core.base.ViewContainer
import com.tencent.kuikly.core.directives.vfor
import com.tencent.kuikly.core.manager.PagerManager
import com.tencent.kuikly.core.reactive.collection.ObservableList
import com.tencent.kuikly.core.reactive.handler.observableList
import com.truedian.wg.components.organism.dialog.internal.DialogHelper
import com.truedian.wg.components.organism.dialog.internal.DialogHelperManager
import com.truedian.wg.components.organism.dialog.internal.DialogItemView
import com.truedian.wg.components.organism.dialog.internal.DialogStackItem

/**
 * 弹窗容器组件
 *
 * 该组件是弹窗系统的核心容器，负责管理和渲染页面中的所有弹窗。
 * 每个页面只需要包含一个此容器组件，即可支持多个弹窗的堆叠显示和管理。
 *
 * ## 主要功能
 * - 管理页面中的弹窗堆栈
 * - 自动注册和移除页面的弹窗助手
 * - 渲染当前页面的所有活跃弹窗
 * - 处理弹窗的动画和生命周期
 *
 * ## 技术实现
 * - 使用[ObservableList]响应式管理弹窗堆栈
 * - 在页面创建时自动注册[DialogHelper]到[DialogHelperManager]
 * - 在页面销毁时自动清理相关资源
 * - 使用绝对定位确保弹窗覆盖整个页面
 *
 * ## 内部机制
 * 1. 组件创建时，为当前页面注册一个[DialogHelper]实例
 * 2. 通过[DialogItemView]渲染每个弹窗项
 * 3. 监听弹窗取消动画完成事件，触发弹窗关闭逻辑
 *
 * @see DialogHelper 弹窗助手，负责具体的弹窗操作
 * @see DialogHelperManager 弹窗助手管理器，管理所有页面的弹窗助手
 * @see DialogItemView 弹窗项视图，负责渲染单个弹窗
 */
internal class InternalDialogContainer : ComposeView<DialogAttr, ComposeEvent>() {

    /**
     * 弹窗堆栈，存储当前页面的所有活跃弹窗
     */
    private var dialogStack: ObservableList<DialogStackItem> by observableList()

    /**
     * 组件创建时的生命周期回调
     *
     * 在此方法中，为当前页面注册一个[DialogHelper]实例，
     * 使页面能够通过[com.truedian.wg.components.organism.dialogUtil.DialogUtil]显示和管理弹窗。
     */
    override fun created() {
        super.created()
        if (!DialogHelperManager.containsPagerId(pagerId)) {
            val basePager = PagerManager.getPager(pagerId) as? BasePager
            if (basePager != null) {
                DialogHelperManager.addDialogHelper(
                    pagerId,
                    DialogHelper(basePager, dialogStack)
                )
            }
        }


    }

    /**
     * 组件销毁时的生命周期回调
     *
     * 在此方法中，从[DialogHelperManager]中移除当前页面的弹窗助手，
     * 确保资源被正确释放，避免内存泄漏。
     */
    override fun viewDestroyed() {
        super.viewDestroyed()
        DialogHelperManager.removeDialogHelper(pagerId)
    }

    /**
     * 构建组件视图
     *
     * 创建一个覆盖整个页面的容器，并使用vfor指令渲染弹窗堆栈中的每个弹窗。
     * 每个弹窗项通过[DialogItemView]组件进行渲染。
     *
     * @return 视图构建器函数
     */
    override fun body(): ViewBuilder {

        val ctx = this

        return {
            attr {
              absolutePositionAllZero()
            }

            vfor({ ctx.dialogStack }) {

                DialogItemView {
                    attr {
                        absolutePositionAllZero()
                        dialogStackItem = it

                    }

                    event {
                        onCancelAnimFinish = {
                            val dialogHelper = DialogHelperManager.getDialogHelper(pagerId)
                            dialogHelper?.cancelDialog(it.dialogId)
                        }
                    }
                }
            }

        }
    }

    /**
     * 创建组件属性对象
     *
     * @return 新的[DialogAttr]实例
     */
    override fun createAttr() = DialogAttr()

    /**
     * 创建组件事件对象
     *
     * @return 新的[DialogEvent]实例
     */
    override fun createEvent() = DialogEvent()

}

/**
 * 弹窗容器属性类
 *
 * 当前版本中没有特定的属性，保留此类以便未来扩展。
 */
class DialogAttr : ComposeAttr()

/**
 * 弹窗容器事件类
 *
 * 当前版本中没有特定的事件，保留此类以便未来扩展。
 */
internal class DialogEvent : ComposeEvent()

/**
 * 弹窗容器DSL构建函数
 *
 * 提供一个便捷的DSL方式来添加弹窗容器到视图容器中。
 *
 * @param init 初始化弹窗容器的lambda表达式
 */
internal fun ViewContainer<*, *>.DialogContainer(init: InternalDialogContainer.() -> Unit) {
    addChild(InternalDialogContainer(), init)
}